home *** CD-ROM | disk | FTP | other *** search
- ' #############################################
- ' IBM PC BASICA to Atari ST GFA BASIC .LST
- ' conversion utility
- ' #############################################
- ' by myeck waters, 94/08/24
- ' This program is in the Public Domain
- ' #############################################
- ' Not to mention that it's pretty badly written
- ' #############################################
- '
- ' #############
- end$="ENDIF"+CHR$(13)+CHR$(10)
- go$="GOTO"
- pro$="PROCEDURE "
- begin:
- FILESELECT "*.bas","gwbasic.bas",a$
- IF a$<>""
- GOTO next1
- ENDIF
- END
- ' ##################################
- ' make sure input filename has a "."
- ' ##################################
- next1:
- l#=LEN(a$)
- m#=l#
- loop1:
- IF MID$(a$,m#-1,1)="\"
- GOTO next2
- ENDIF
- DEC m#
- GOTO loop1
- next2:
- n#=l#
- loop2:
- IF MID$(a$,n#,1)="."
- GOTO next3
- ENDIF
- IF n#=0
- n#=l#+1
- a$=a$+"."
- GOTO next3
- ENDIF
- DEC n#
- GOTO loop2
- next3:
- FILESELECT "*.*","output.lst",z$
- IF z$<>""
- GOTO next4
- ENDIF
- END
- next4:
- OPEN "I",#1,a$
- ' #################
- ' set buffers, etc.
- ' #################
- size#=LOF(#1)
- DIM inbuf%(5+INT(size#/4)) ! input buffer
- DIM outbuf%(size#/2) ! output buffer
- DIM numbers#(1000) ! for line numbers that are actually
- DIM subs#(1000) ! used in GOSUB, GOTO, ELSE, THEN
- inbuffer#=VARPTR(inbuf%(0))
- outbuffer#=VARPTR(outbuf%(0))
- atime#=TIMER/200 ! a timer
- ' ###################
- ' load BASICA file
- ' ###################
- BLOAD a$,inbuffer#
- PRINT
- inptr#=inbuffer#
- outptr#=outbuffer#
- numcount#=0
- ' #############################
- ' checking for line numbers
- ' after GOTO, GOSUB, THEN, ELSE
- ' #############################
- CLS
- PRINT
- PRINT "Checking for referenced line numbers:"
- PRINT
- kerser#=0
- i#=0
- search:
- issub#=FALSE
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$="'" ! a REMark
- GOTO foundrem
- ENDIF
- IF b$="R" OR b$="r" ! a REMark?
- GOTO checkrem
- ENDIF
- IF b$="T" OR b$="t" ! THEN?
- GOTO checkthen
- ENDIF
- IF b$="G" OR b$="g" ! GOTO or GOSUB?
- GOTO checkgo
- ENDIF
- IF b$="E" OR b$="e" ! ELSE?
- GOTO checkelse
- ENDIF
- INC i#
- IF i#<size#
- GOTO search
- ENDIF
- GOTO convert
- ' #############
- ' check for REM
- ' #############
- checkrem:
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"E" AND b$<>"e"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"M" AND b$<>"m"
- GOTO search
- ENDIF
- ' ############################################
- ' found a REM, nothing to check 'til next line
- ' ############################################
- foundrem:
- fr2:
- INC i#
- IF i#=>size#
- GOTO convert
- ENDIF
- IF PEEK(inbuffer#+i#)<>13 ! CHR$(13) = <CR>
- GOTO fr2
- ENDIF
- GOTO search
- ' ##############
- ' check for THEN
- ' ##############
- checkthen:
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"H" AND b$<>"h"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"E" AND b$<>"e"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"N" AND b$<>"n"
- GOTO search
- ENDIF
- GOTO checknum
- ' ##############
- ' check for ELSE
- ' ##############
- checkelse:
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"L" AND b$<>"l"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"S" AND b$<>"s"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"E" AND b$<>"e"
- GOTO search
- ENDIF
- GOTO checknum
- ' #######################
- ' check for GOSUB or GOTO
- ' #######################
- checkgo:
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"O" AND b$<>"o"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$="S" OR b$="s"
- GOTO checksub
- ENDIF
- IF b$<>"T" AND b$<>"t"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"O" AND b$<>"o"
- GOTO search
- ENDIF
- GOTO checknum
- ' ###############
- ' check for GOSUB
- ' ###############
- checksub:
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"U" AND b$<>"u"
- GOTO search
- ENDIF
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$<>"B" AND b$<>"b"
- GOTO search
- ENDIF
- issub#=TRUE ! the GOSUB flag
- ' #####################
- ' look for line numbers
- ' #####################
- checknum:
- num$=""
- cn1:
- INC i#
- IF i#=>size#
- GOTO convert
- ENDIF
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$=CHR$(13)
- GOTO search
- ENDIF
- IF b$=" "
- GOTO cn1
- ENDIF
- IF b$>"/" AND b$<":"
- GOTO cn2
- ENDIF
- GOTO search
- ' ##################
- ' found line numbers
- ' ##################
- cn2:
- num$=""
- cn3:
- num$=num$+b$
- INC i#
- IF i#=>size#
- GOSUB numend
- GOTO search
- ENDIF
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$>"/" AND b$<":"
- GOTO cn3
- ENDIF
- IF b$="," ! commas always mean more line numbers(?)
- GOSUB numend
- INC i#
- b$=CHR$(PEEK(inbuffer#+i#))
- GOTO cn2
- ENDIF
- GOSUB numend
- GOTO search
- ' ##############
- PROCEDURE numend
- IF VAL(num$)
- IF numcount#=0
- numbers#(numcount#)=VAL(num$)
- PRINT num$;" ";
- kerser#=kerser#+10
- IF issub#
- subs#(numcount#)=TRUE
- ELSE
- subs#(numcount#)=FALSE
- ENDIF
- INC numcount#
- ELSE
- match#=FALSE
- FOR j#=0 TO numcount#
- IF VAL(num$)=numbers#(j#)
- match#=TRUE
- ENDIF
- NEXT j#
- IF match#=FALSE
- numbers#(numcount#)=VAL(num$)
- HTAB kerser#+1
- PRINT num$;
- kerser#=kerser#+10
- IF kerser#>70
- kerser#=0
- PRINT
- ENDIF
- IF issub#
- subs#(numcount#)=TRUE
- ELSE
- subs#(numcount#)=FALSE
- ENDIF
- INC numcount#
- ENDIF
- ENDIF
- ENDIF
- RETURN
- ' ###############
- ' converting text
- ' ###############
- convert:
- PRINT
- PRINT
- PRINT "converting lines: "
- PRINT
- counter#=0
- i#=0
- o#=0
- ' ###############
- ' begin next line
- ' ###############
- nextline:
- PRINT ".";
- IF counter#>999
- temp#=FRE(0)
- counter#=0
- ENDIF
- foundif#=FALSE
- foundcom#=FALSE
- inquotes#=FALSE
- issub#=FALSE
- line$=""
- findline:
- b#=PEEK(inbuffer#+i#)
- IF b#<47 OR b#>58
- INC i#
- GOTO findline
- ENDIF
- ' ###############
- findline2:
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$>"/" AND b$<":"
- line$=line$+b$
- INC i#
- GOTO findline2
- ENDIF
- line#=VAL(line$)
- match#=FALSE
- FOR j#=0 TO numcount#
- IF line#=numbers#(j#)
- match#=TRUE
- IF subs#(j#)
- issub#=TRUE
- ENDIF
- ENDIF
- NEXT j#
- IF match#
- IF issub#
- FOR j#=1 TO LEN(pro$)
- POKE outbuffer#+o#,ASC(MID$(pro$,j#,1))
- INC o#
- NEXT j#
- ENDIF
- FOR j#=1 TO LEN(line$)
- POKE outbuffer#+o#,ASC(MID$(line$,j#,1))
- INC o#
- NEXT j#
- IF issub#=FALSE
- POKE outbuffer#+o#,58
- INC o#
- ENDIF
- POKE outbuffer#+o#,13
- INC o#
- POKE outbuffer#+o#,10
- INC o#
- ENDIF
- ' GOTO nextchar
- ' ###############################
- ' check for leading REM or ' or !
- ' ###############################
- leadrem:
- b$=CHR$(PEEK(inbuffer#+i#))
- IF b$="'"
- GOTO moverem
- ENDIF
- IF b$=" "
- INC i#
- GOTO leadrem
- ENDIF
- IF b$<>"R" AND b$<>"r"
- GOTO nextchar
- ENDIF
- b$=CHR$(PEEK(inbuffer#+i#+1))
- IF b$<>"E" AND b$<>"e"
- GOTO nextchar
- ENDIF
- b$=CHR$(PEEK(inbuffer#+i#+2))
- IF b$<>"M" AND b$<>"m"
- GOTO nextchar
- ENDIF
- ' ######################
- ' it's a REM, so move it
- ' ######################
- moverem:
- b#=PEEK(inbuffer#+i#)
- POKE outbuffer#+o#,b#
- INC i#
- INC o#
- IF b#=13
- DEC o#
- IF foundif#
- byte#=b#
- DEC i#
- GOTO iscr
- ENDIF
- GOSUB crpoke
- GOTO nextline
- ENDIF
- GOTO moverem
- ' ####################
- ' check next character
- ' ####################
- nextchar:
- IF i#=>size#
- GOTO finis
- ENDIF
- byte#=PEEK(inbuffer#+i#)
- ' #######################
- ' is it a quote mark (")?
- ' #######################
- IF byte#=34
- IF inquotes#
- inquotes#=FALSE
- ELSE
- inquotes#=TRUE
- ENDIF
- POKE outbuffer#+o#,byte#
- INC o#
- INC i#
- GOTO nextchar
- ENDIF
- ' ####################################
- ' an apostrophe'd REM after a command?
- ' ####################################
- IF byte#=39 AND inquotes#=FALSE
- POKE outbuffer#+o#,33
- INC o#
- INC i#
- GOTO moverem
- ENDIF
- IF byte#=58 AND inquotes#=FALSE
- ' POKE outbuffer+o,13
- ' INC o
- ' POKE outbuffer+o,10
- ' INC o
- ' INC i
- GOSUB crpoke
- foundcom#=FALSE
- ' foundif=FALSE
- GOTO nextchar
- ENDIF
- ' ##########################
- ' an actual carriage retuen?
- ' ##########################
- iscr:
- IF byte#=13
- GOSUB crpoke
- INC i#
- IF foundif#
- WHILE foundif#
- FOR j#=1 TO LEN(end$)
- POKE outbuffer#+o#,ASC(MID$(end$,j#,1))
- INC o#
- NEXT j#
- DEC foundif#
- WEND
- ENDIF
- GOTO nextline
- ENDIF
- IF foundcom#=FALSE
- IF CHR$(byte#)="I" OR CHR$(byte#)="i"
- foundcom#=TRUE
- POKE outbuffer#+o#,byte#
- INC o#
- INC i#
- byte#=PEEK(inbuffer#+i#)
- IF CHR$(byte#)="F" OR CHR$(byte#)="f"
- foundif#=foundif#+1
- POKE outbuffer#+o#,byte#
- INC o#
- INC i#
- GOTO nextchar
- ENDIF
- ENDIF
- ENDIF
- ' ###########################################
- ' looking for THEN, GOSUB or GOTO after an IF
- ' ###########################################
- IF foundif# !AND foundcom
- b$=CHR$(byte#)
- IF b$="T" OR b$="t"
- GOTO ckit
- ENDIF
- IF b$="G" OR b$="g"
- GOTO ckig
- ENDIF
- IF b$="E" OR b$="e"
- GOTO ckie
- ENDIF
- ENDIF
- ' ##############################
- ' copy character and go for next
- ' ##############################
- POKE outbuffer#+o#,byte#
- INC i#
- INC o#
- GOTO nextchar
- ' ################################
- ' ################################
- ' ##############
- ' check for THEN
- ' ##############
- ckit:
- IF CHR$(PEEK(inbuffer#+i#+1))<>"H" AND CHR$(PEEK(inbuffer#+i#+1))<>"h"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+2))<>"E" AND CHR$(PEEK(inbuffer#+i#+2))<>"e"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+3))<>"N" AND CHR$(PEEK(inbuffer#+i#+3))<>"n"
- GOTO ckng
- ENDIF
- i#=i#+3
- GOSUB crpoke
- ' ################################
- ' check if THEN followed by line #
- ' ################################
- ckit1:
- j#=i#+1
- ckit2:
- b2#=PEEK(inbuffer#+j#)
- IF b2#=32
- INC j#
- GOTO ckit2
- ENDIF
- IF b2#>47 AND b2#<58
- FOR j#=1 TO LEN(go$)
- POKE outbuffer#+o#,ASC(MID$(go$,j#,1))
- INC o#
- NEXT j#
- ENDIF
- GOTO nextchar
- ' #####################
- ' ELSE following an IF?
- ' #####################
- ckie:
- IF CHR$(PEEK(inbuffer#+i#+1))<>"L" AND CHR$(PEEK(inbuffer#+i#+1))<>"l"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+2))<>"S" AND CHR$(PEEK(inbuffer#+i#+2))<>"s"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+3))<>"E" AND CHR$(PEEK(inbuffer#+i#+3))<>"e"
- GOTO ckng
- ENDIF
- GOSUB crpoke
- DEC i#
- FOR j#=1 TO 4
- POKE outbuffer#+o#,PEEK(inbuffer#+i#)
- INC o#
- INC i#
- NEXT j#
- GOSUB crpoke
- DEC i#
- GOTO ckit1
- ' ########################
- ' check for GOSUB and GOTO
- ' ########################
- ckig:
- IF CHR$(PEEK(inbuffer#+i#+1))<>"O" AND CHR$(PEEK(inbuffer#+i#+1))<>"o"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+2))="S" OR CHR$(PEEK(inbuffer#+i#+2))="s"
- GOTO cksub
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+2))<>"T" AND CHR$(PEEK(inbuffer#+i#+2))<>"t"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+3))<>"O" AND CHR$(PEEK(inbuffer#+i#+3))<>"o"
- GOTO ckng
- ENDIF
- GOSUB crpoke
- POKE outbuffer#+o#,ASC(b$)
- INC o#
- GOTO nextchar
- cksub:
- IF CHR$(PEEK(inbuffer#+i#+3))<>"U" AND CHR$(PEEK(inbuffer#+i#+3))<>"u"
- GOTO ckng
- ENDIF
- IF CHR$(PEEK(inbuffer#+i#+4))<>"B" AND CHR$(PEEK(inbuffer#+i#+4))<>"b"
- GOTO ckng
- ENDIF
- GOSUB crpoke
- POKE outbuffer#+o#,ASC(b$)
- INC o#
- GOTO nextchar
- ' ######################
- ' Not a match so keep on
- ' ######################
- ckng:
- POKE outbuffer#+o#,byte#
- INC o#
- INC i#
- GOTO nextchar
- ' ########################
- ' add a line feed
- ' #######################
- PROCEDURE crpoke
- POKE outbuffer#+o#,13
- INC o#
- POKE outbuffer#+o#,10
- INC o#
- INC i#
- foundcom#=FALSE
- RETURN
- ' #########
- ' finish up
- ' ##########
- finis:
- CLOSE #1
- POKE outbuffer#+o#,13
- INC o#
- POKE outbuffer#+o#,10
- INC o#
- BSAVE z$,outbuffer#,o#+1
- PRINT
- PRINT "done."
- btime#=1+INT((TIMER/200)-atime#)
- ctime#=INT(btime#/60)
- btime#=btime#-(ctime#*60)
- PRINT
- PRINT "Conversion time:"
- PRINT " ";
- IF ctime#
- PRINT ctime#;" minute";
- IF ctime#>1
- PRINT "s";
- ENDIF
- PRINT ", ";
- ENDIF
- PRINT btime#;" second";
- IF btime#>1
- PRINT "s";
- ENDIF
- PRINT "."
- ALERT 0,"all done",1,"ok",g#
- EDIT
- ' ####################
-